package cn.tedu.spring;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

import java.security.PublicKey;

//aop
@Component//ioc
@Aspect//spring整合了aspectj提供了面向切面编程的方式
public class TimeAspect {
    //切点 什么时候要触发通知的功能
    //方法返回值 报名 类名 方法名(参数列表)
//    @Pointcut("execution(*cn.tedu.controller.*.*(..))")
//   public class pointcut {} 不是 class

    @Pointcut("execution(* cn.tedu.controller.*.*(..))")
    public void pointcut(){}
    @After("pointcut()")//后置通知,在每一个方法结束后被调用
    public void afterMethod(JoinPoint joinPoint){
        System.out.println("我是后置通知");
    }

    //切面就是一个类 由通知（就是方法）组成
    @Before("pointcut()")//这是前置通知 在调用业务方法前 触发执行
    public void beforeMethod(JoinPoint joinPoint){
        System.out.println("我是前置通知咩");

    }
    @Around("pointcut()")
    public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable{
        //统计每个方法的执行性能
        long start = System.currentTimeMillis();//计时开始
        Object o = joinPoint.proceed();//找到目标方法并执行
        long end = System.currentTimeMillis(); //计时结束
        System.out.println("aop统计的结果表示，方法的耗时是："+(end-start));
        return o ;//放行，执行目标方法
    }
}
